<?php
namespace app\admin\model;

/*客服模型*/
use app\admin\model\CommonModel;
use app\admin\model\User;

class KfCate extends CommonModel
{
    private $table_name = 'kf_cate';
    public function __construct()
    {
       parent::__construct();
    }
    /**初始化参数
     * @param $args [client_id,token,enc_string,nickname]
     * @return array
     */
    private function default_param($args)
    {
        $default = [
            "name"     => "",
            "description" => "",
            "parent_id"      => "",
        ];
        return array_merge($default,$args);
    }

    /**新增一个分类
     * @param $args [name,description,parent_id]
     * @return client_id
     */
    public function addCate($args)
    {
        //初始化参数
        $args = $this->default_param($args);
        //客服账号密码不得空
        if(empty($args['name']) )
        {
            return $this->returnState(1,"信息填写不完整");
        }
        //如果客服已存在，则返回false
        $cateInfo = $this->info(['name'=>$args['name'],'where_name'=>'=']);
        if(!empty($cateInfo['data']))
        {
            return $this->returnState(1,"该职责名称已被占用，请更换");
        }
        //插入数据库
        $kf_id =  db($this->table_name)->insertGetId([
            'name'      => $args['name'],
            'description'   => $args['description'],
            'parent_id'   => intval($args['parent_id']),
        ]);

        //返回成功标识
        return $this->returnState(0,"成功添加职责");
    }

    //查询一个分类
    public function info($args)
    {
        /**
         * args参数说明
         * args.id 分类id
         * args.name 分类名称
         * args.where_name 如何该值为 = ，则会匹配 where name  = 否则 匹配 where name like '%%';
         */
        $where = [];

        //匹配id
        if(isset($args['id']) && intval($args['id']) > 0)
        {
            $where['id'] = $args['id'];
        }
        //匹配name
        if(isset($args['name']) && !empty($args['name']))
        {
            $where['name'] = isset($args['where_name']) && $args['where_name'] == '=' ? $args['name'] : ['like','%'+$args['name']+'%'];
        }
        if(empty($where)) return $this->returnState(1,"客服职责查询，没有可筛选的条件");

        $data = db($this->table_name)->where($where)->find();

        //返回查询信息
        return ['error'=>0,'data'=>$data];
    }

    //获取所有分类
    public function all()
    {
        return db($this->table_name)->order('id ASC')->select();
    }

    //删除客服分类
    public function del($args)
    {
        /**
         * args参数说明
         * args为一个数组，包含所有的id值
         */
        if(empty($args))
        {
            return $this->returnState(1,"没有客服被删除");
        }
        $preCount = count($args);
        //获取多个分类的父id
        $parentIdList = db($this->table_name)->field('id,parent_id')->where(['parent_id'=>['in',implode(',',$args)]])->select();

        //删除args中分类id含有子类的分类id
        if(!empty($parentIdList))
        foreach($parentIdList as $k=>$v)
        {
            foreach($args as $k1=>$v1)
            {
                if($v1 == $v['parent_id'])
                {
                    unset($args[$k1]);
                }
            }
        }
        if(empty($args))
        {
            return $this->returnState(1,"删除失败，您选择的职责下有子职责，需先删除子职责");
        }
        $nowCount = count($args);
        //职责删除
        db($this->table_name)->where(['id'=>['in',implode(',',$args)]])->delete();

        //更新依赖客服职责的其他数据表
        $this->resetOtherTabelWithCate($args);

        return $this->returnState(0,
            $preCount == $nowCount ? "删除完毕" : "由于部分职责下有子类的职责，您只有部分职责被删除"
        );
    }

    //更新依赖客服职责表的其他表外键，设置为0
    public function resetOtherTabelWithCate($args)
    {
        /**
         * args参数说明
         * args 可以是一个数组，也可以是一个值
         *
         */
        db('kf')->where(['cate_id'=>['in',implode(',',$args)]])->update(['cate_id'=>0]);
    }

    //编辑一个客服
    public function edit($args)
    {
        /**
         * args参数说明
         * args.id
         * args.name
         * args.description
         * args.parent_id
         */

        //检查参数
        $args = $this->default_param($args);
        if(!isset($args['id']) || intval($args['id']) == 0)
        {
            return $this->returnState(1,"没有选择职责");
        }

        //检查职责
        $info = $this->info(['id'=>intval($args['id'])]);
        if($info['error'] != 0 || empty($info['data']))
        {
            return $this->returnState(1,"职责不存在，或者已被删除");
        }
        //检查父职责
        if($args['parent_id'] !=0 )
        {
            $parentInfo = $this->info(['id'=>intval($args['parent_id'])]);
            if($parentInfo['error'] != 0 || empty($parentInfo['data']))
            {
                return $this->returnState(1,"职责不存在，或者已被删除");
            }
        }


        $id = $info['data']['id'];

        //合并两个数组
        $fields = ['name','description','parent_id'];
        $update = array_merge(resetArr($info['data'],$fields),resetArr($args,$fields));
        //由于0位空，则array_filter过滤掉，因此保存
        $parent_id = $update['parent_id'];
        //删除空的项
        $update = array_filter($update);
        $update = array_merge($update,['parent_id'=>$parent_id]);
        //客服更新
        db($this->table_name)->where(['id'=>$id])->update($update);

        return $this->returnState(0,"职责信息更新完毕");
    }


}
